﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using Datos;

namespace Negocio
{
    public class Cliente : Persona
    {
        #region Constantes

        const string ERR_SOURCE = "Cliente";
        const string USUARIO_LOGIN = "usuarioLogin";

        #endregion

        #region Atributos y Propiedades  

        private string _codigo;
        public string Codigo
        {
            get { return _codigo; }
            set { _codigo = value;  MarcarModificado(); }
        }

        private string _cuit;
        public string Cuit
        {
            get { return _cuit; }
            set { _cuit = value;  MarcarModificado(); }
        }

        private string _ingresoBruto;
        public string IngresoBruto
        {
            get { return _ingresoBruto; }
            set { _ingresoBruto = value;  MarcarModificado(); }
        }

        private bool _activo;
        public bool Activo
        {
            get { return _activo; }
            set { _activo = value;  MarcarModificado(); }
        }

        private string _condicionIva;
        public string CondicionIva
        {
            get { return _condicionIva; }
            set { _condicionIva = value;  MarcarModificado(); }
        }

        private string _observacion;
        public string Observacion
        {
            get { return _observacion; }
            set { _observacion = value;  MarcarModificado(); }
        }

        private Usuario _usuario;
        public Usuario Usuario
        {
            get
            {
                if (_usuario == null && GetClaveONull(USUARIO_LOGIN) != null)
                    _usuario = Usuario.ObtenerPorLogin(GetClave(USUARIO_LOGIN).ToString());
                return _usuario;
            }
            set
            {
                SetClave(USUARIO_LOGIN, value != null ? (object)value.Login : null);
                _usuario = value;
                MarcarModificado();
            }
        }

        public string ClienteString
        {
            get { return _apellido + ", " + _nombre + " - " + _codigo; }
        }

        #endregion

        #region Acceso a Datos

        protected override bool LeerDB()
        {
            bool existe = false;
            object[] parametros = { null, null, null, null, null, null, null, null, _codigo, null, null, null, null, null, null };
            IDataReader dr = DatosOleDb.DB().ObtenerDataReader("ClienteSFiltro", parametros);
            if (dr.Read())
            {
                CargarDR(dr);
                existe = true;
            }
            dr.Close();
            return existe;
        }

        protected override void InsertDB()
        {
		    object[] parametros = new object[] {_nombre , _apellido , _telefono , _direccion , _barrio , _localidad , _provincia , _email , _codigo , _cuit , _ingresoBruto , _activo , _condicionIva , _observacion , GetClaveONull(USUARIO_LOGIN) };
            DatosOleDb.DB().TxBegin();
            try
            {
                DatosOleDb.DB().EnviarDatos("ClienteI", ref parametros);
                DatosOleDb.DB().TxCommit();
            }
            catch (System.Data.OleDb.OleDbException)
            {
                DatosOleDb.DB().TxRollback();
                DatosException ex = new DatosException("Ya existe un Cliente con el código " + _codigo, ERR_SOURCE);
                throw ex;
            }
            catch (Exception)
            {
                DatosOleDb.DB().TxRollback();
                throw;
            }
        }

        protected override void UpdateDB()
        {
		object[] parametros = new object[] {_nombre , _apellido , _telefono , _direccion , _barrio , _localidad , _provincia , _email , _codigo , _cuit , _ingresoBruto , _activo , _condicionIva , _observacion , GetClaveONull(USUARIO_LOGIN) };
            DatosOleDb.DB().TxBegin();
            try
            {
                DatosOleDb.DB().EnviarDatos("ClienteU", ref parametros);
                DatosOleDb.DB().TxCommit();
            }
            catch (System.Data.OleDb.OleDbException)
            {
                DatosOleDb.DB().TxRollback();
                DatosException ex = new DatosException("Ya existe un Cliente con el código " + _codigo, ERR_SOURCE);
                throw ex;
            }
            catch (Exception)
            {
                DatosOleDb.DB().TxRollback();
                throw;
            }
        }

        protected override void DeleteDB()
        {
            object[] parametros = new object[] {_codigo };
            DatosOleDb.DB().TxBegin();
            try
            {
                DatosOleDb.DB().EnviarDatos("ClienteD", ref parametros);
                DatosOleDb.DB().TxCommit();
            }
            catch (Exception)
            {
                DatosOleDb.DB().TxRollback();
                throw;
            }
        }

        protected override void CargarDR(IDataReader dr)
        {          
            _nombre = dr["nombre"].ToString();
	        _apellido = dr["apellido"].ToString();
	        _telefono = dr["telefono"].ToString();
	        _direccion = dr["direccion"].ToString();
	        _barrio = dr["barrio"].ToString();
	        _localidad = dr["localidad"].ToString();
	        _provincia = dr["provincia"].ToString();
	        _email = dr["email"].ToString();
	        _codigo = dr["codigo"].ToString();
	        _cuit = dr["cuit"].ToString();
	        _ingresoBruto = dr["ingresoBruto"].ToString();
	        _activo = (Boolean) dr["activo"];
	        _condicionIva = dr["condicionIva"].ToString();
	        _observacion = dr["observacion"].ToString();
	        SetClave(USUARIO_LOGIN, dr[USUARIO_LOGIN]);
	        MarcarViejo();
        }

        public override void Validar()
        {
            InconsistenciaException ex = new InconsistenciaException();
            ex.Source = ERR_SOURCE;
            if (_codigo == string.Empty) ex.AgregarError("Dato requerido", "Codigo");
            if (_nombre == string.Empty) ex.AgregarError("Dato requerido", "Nombre");
            if (_apellido == string.Empty) ex.AgregarError("Dato requerido", "Apellido");
            ex.Lanzar();
        }

        #endregion

        #region Metodos estaticos de clase

        public static Cliente ObtenerPorCodigo(string codigo)
        {
            Cliente obj = new Cliente();
            obj._codigo = codigo;
            if (obj.LeerDB())
            {
                return obj;
            }
            else
            {
                return null;
            }
        }

        public static List<Cliente> ObtenerTodos()
        {
            Cliente obj;
            List<Cliente> lista = new List<Cliente>();
            object[] parametros = { null, null, null, null, null, null, null, null, null, null, null, null , null, null, null};
            IDataReader dr;
            dr = DatosOleDb.DB().ObtenerDataReader("ClienteSFiltro", parametros);
            while (dr.Read())
            {
                obj = new Cliente();
                obj.CargarDR(dr);             
                lista.Add(obj);
            }
            dr.Close();
            return lista;
        }

        public static List<Cliente> ObtenerPorFiltro(string nombre , string apellido, string codigo , string cuit)
        {
            Cliente obj;
            List<Cliente> lista = new List<Cliente>();
            object[] parametros = { nombre, apellido, null, null, null, null, null, null, codigo, cuit, null, null, null, null , null};
            IDataReader dr;
            dr = DatosOleDb.DB().ObtenerDataReader("ClienteSFiltro", parametros);
            while (dr.Read())
            {
                obj = new Cliente();
                obj.CargarDR(dr);             
                lista.Add(obj);
            }
            dr.Close();
            return lista;
        }
        #endregion
    }
}
